package com.aerozhonghuan.archive.mapper;

import com.aerozhonghuan.archive.entity.DataRecord;
import com.aerozhonghuan.archive.vo.MinMaxVO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * SourceMapper 接口用于操作源数据库中的数据记录
 *
 */
@Mapper
public interface SourceMapper {

    /**
     * 统计指定时间范围内源库中指定表的记录数
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param currentTime     当前时间，用于作为筛选条件
     * @return 指定条件下的记录数
     */
    long countByTimeStamp(@Param("sourceDbName") String sourceDbName,
                          @Param("sourceTableName") String sourceTableName,
                          @Param("timeStampColumn") String timeStampColumn,
                          @Param("currentTime") Date currentTime);

    /**
     * 统计指定时间范围内源库中指定表的记录数
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param startTime     开始时间
     * @param endTime     结束时间
     * @return 指定条件下的记录数
     */
    long countByMigration(@Param("sourceDbName") String sourceDbName,
                          @Param("sourceTableName") String sourceTableName,
                          @Param("timeStampColumn") String timeStampColumn,
                          @Param("startTime") Date startTime,
                          @Param("endTime") Date endTime);

    /**
     * 统计指定时间范围内的记录数，条件为时间字段在 [startTime, endTime)
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 源表名称
     * @param timeStampColumn 时间字段名称
     * @param startTime       起始时间（包含）
     * @param endTime         结束时间（不包含）
     * @return 指定时间范围内的记录数
     */
    long countByTimeRange(@Param("sourceDbName") String sourceDbName,
                          @Param("sourceTableName") String sourceTableName,
                          @Param("timeStampColumn") String timeStampColumn,
                          @Param("startTime") Date startTime,
                          @Param("endTime") Date endTime);

    /**
     * 查询指定时间范围内源库中指定表的最小和最大主键值
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param currentTime     当前时间，用于作为筛选条件
     * @return 包含最小和最大主键的对象
     */
    MinMaxVO getMinMaxId(@Param("sourceDbName") String sourceDbName,
                         @Param("sourceTableName") String sourceTableName,
                         @Param("timeStampColumn") String timeStampColumn,
                         @Param("currentTime") Date currentTime);

    /**
     * 查询源库中指定表中主键大于等于指定值的第一条记录
     *
     * @param schemaName 源库名称
     * @param tableName  表名称
     * @param id         要比较的主键值
     * @return 第一条满足条件的记录
     */
    DataRecord getRecordByIdGreaterOrEqual(@Param("schemaName") String schemaName,
                                           @Param("tableName") String tableName,
                                           @Param("id") Long id);

    /**
     * 计算源库中指定表中单行记录的 MD5 摘要值
     *
     * @param schemaName 源库名称
     * @param tableName  表名称
     * @param id         记录主键
     * @param columns    用于拼接计算 MD5 摘要的字段列表
     * @return 记录的 MD5 摘要字符串
     */
    String getRowMd5(@Param("schemaName") String schemaName,
                     @Param("tableName") String tableName,
                     @Param("id") Long id,
                     @Param("columns") String columns);

    /**
     * 查询源库中指定表中时间字段的最大值
     *
     * @param schemaName      源库名称
     * @param tableName       表名称
     * @param timeStampColumn 时间字段名称
     * @return 指定表中时间字段的最大值
     */
    Date getMaxTime(@Param("schemaName") String schemaName,
                    @Param("tableName") String tableName,
                    @Param("timeStampColumn") String timeStampColumn);



    /**
     * 批量插入数据记录到目标表（全量数据迁移）
     *
     * @param dataList         数据记录列表
     * @param sourceDbName     目标数据库名称
     * @param sourceTableName  目标表名称
     * @param columns          字段列表
     * @return 成功插入的记录数
     */
    int insertBatchGeneric(@Param("dataList") List<Object[]> dataList,
                           @Param("sourceDbName") String sourceDbName,
                           @Param("sourceTableName") String sourceTableName,
                           @Param("columns") String columns);


    /**
     * 查询指定时间范围内的记录 ID 列表
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 源表名称
     * @param timeStampColumn 用于过滤的时间字段名称
     * @param start           起始时间（包含）
     * @param end             结束时间（不包含）
     * @return 符合条件的 ID 列表
     */
    List<Long> fetchIdsByTimeRange(@Param("sourceDbName") String sourceDbName,
                                   @Param("sourceTableName") String sourceTableName,
                                   @Param("timeStampColumn") String timeStampColumn,
                                   @Param("start") Date start,
                                   @Param("end") Date end);


    /**
     * 查询满足删除条件的所有记录ID
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param baseDate        基准日期
     * @return 符合条件的记录ID列表
     */
    List<Long> fetchIdsForDeletion(@Param("sourceDbName") String sourceDbName,
                                   @Param("sourceTableName") String sourceTableName,
                                   @Param("timeStampColumn") String timeStampColumn,
                                   @Param("baseDate") Date baseDate,
                                   @Param("deleteMonth") int deleteMonth);

    /**
     * 根据ID列表批量删除源库中数据
     *
     * @param sourceDbName    源库名称
     * @param sourceTableName 表名称
     * @param timeStampColumn 时间字段名称
     * @param idList          待删除的记录ID列表
     * @return 删除的记录数
     */
    int deleteSourceRecordsByIds(@Param("sourceDbName") String sourceDbName,
                                 @Param("sourceTableName") String sourceTableName,
                                 @Param("timeStampColumn") String timeStampColumn,
                                 @Param("idList") List<Long> idList);

    /**
     * 按迁移时间范围分批删除数据记录
     *
     * @param sourceDbName    数据库名称
     * @param sourceTableName 表名称
     * @param timeStampColumn      时间字段名称
     * @param startTime       开始时间
     * @param endTime         结束时间
     * @param idList       每次删除的记录数
     * @return 实际删除的记录数
     */
    int deleteSourceRecordsByMigration(@Param("sourceDbName") String sourceDbName,
                                  @Param("sourceTableName") String sourceTableName,
                                  @Param("timeStampColumn") String timeStampColumn,
                                  @Param("startTime") Date startTime,
                                  @Param("endTime") Date endTime,
                                  @Param("idList") List<Long> idList);

    /**
     * 按时间游标批量拉取记录
     */
    List<Map<String, Object>> fetchByTimeRangeBatch(
            @Param("schema") String schema,
            @Param("table") String table,
            @Param("tsColumn") String tsColumn,
            @Param("cursor") Date cursor,
            @Param("targetTime") Date targetTime,
            @Param("batchSize") int batchSize
    );
}
